#include <regex>
#include <iostream>
#include <string>
//
int main()
{
    //一个http请求报头  
    std::string s = "get /testdir/login HTTP/1.1\r\n";
    std::smatch sm;
    std::regex e ("(GET|HEAD|PUT|POST|DELETE) ([^?]*)(?:\\?(.*))? (HTTP/1\\.[01])(?:\r|\r\n|\n)?",std::regex::icase);
    // std::regex e ("(GET|HEAD|PUT|POST|DELETE) ([^?]*)(?:\\?(.*))? (HTTP/1\\.[01])(?:\r|\r\n|\n)?"); //匹配规则，直接使用 () 包起来
    bool ret = std::regex_match(s,sm,e);
    if (!ret){
        return -1;
    }
    std::string method = sm[1];
    std::transform(method.begin(),method.end(),method.begin(),::toupper);
    std::cout << method << std::endl;
    for (int i = 0; i < sm.size(); i++){
        std::cout << i << " : " << sm[i] << std::endl;
    }
    // for (auto& s : sm){
    //     std::cout << s << std::endl;
    // }    
    /* 
    "(GET|HEAD|PUT|POST|DELETE).*" 解析: 
    (|): 代表的时匹配 | 分割的任意一个都可以
    '.' : 这个代表匹配除了 '\r' 或者 '\n' 以为的任意字符
    '.*': 代表的就是匹配除了'\r' 或者 '\n'的任意字符任意次，所以我们返回的时候会先返回匹配到的全部字符串，然后才是我们捕捉的GET。
    */
    //假设今天我要进行，匹配number后面的1234数字字符
    //参数介绍：
    //std::regex_match(const std::string& src,std::smatch& sm,std::regex& e);
    //src: 原始字符串
    //sm : 类似一个数组，按照匹配规则匹配得到后的结果字符串都会放到这里面，我们直接循环遍历即可得到
    //e: 正则匹配规则
    /*
    "/number/(\\d.*)": 表示我们要匹配一 "/number/" 为开头
    在正则表达式中： \d 代表匹配数字字符，但是 \d 会被转义 (ASCALL)，所以我需要使用 \\d 把 '\' 转化为 '\'，这样我们才是 '\d'
    (\\d*): 括号括起来的代表我们要捕捉的，捕捉成功后会保存到我们的sm中。
    '*' : 代表前面匹配前面的表达式任意次。
    */
    return 0;
}